c++中有四种类型转换:static_cast, reinterpret_cast, const_cast, dynamic_cast

static_cast

用于进行静态的语言允许的类型转换,比如int转float,或继承层次上的互相转换。也可进行由构造函数或者类型转换函数支持的转换。不能进行语言不允许的转换,如转换两个完全不相关的类型会失败。

static_cast是不安全的。比如B继承A。可以用static_cast将一个A*的指针转换成B*的指针,即使A*指向的对象实际上不是B

reinterpret_cast

用于进行静态的类型转换。它比static_cast更强大,可以进行语言上不允许的类型转换。比如有两个完全无关的类C,D,可以用reinterpret_castC*转换为D*

reinterpret_cast执行的是字面上的重新解释。即不改变指针或引用的数值,只是重新解释它。

同样不安全。

const_cast

const_cast只有一种简单的用途,即去除const限定符。

const int i = 0;
const int* p0 = &i;
int* p1 = const_cast<int*>(p0);

dynamic_cast

用于进行动态的类型转换。原理是RTTI。因此只能执行类与类之间的转换。并且要求至少有一个虚函数表。最常见的用途是执行继承层次上的向下转换(即基类转子类)。

当转换失败时,如果转换的是指针,会得到结果nullptr。如果转换的是引用,会抛出异常。